package com.aku;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Random;

/*
 继承JPanel类 ，成为面板
 */
public class GamePanel extends JPanel {
    /*
     定义两个数组
     */
    //蛇的长度：
    int length;
    //存x y坐标
    int[] snakeX=new int[1000];
    int[] snakeY=new int[1000];
    //游戏只有开始，暂停；
    boolean isStart=false;//默认暂停
    //加入一个定时器
    Timer timer;
    //定义蛇的行走方向
    String direction;
    //定义食物的x,坐标
    int foodX;
    int foodY;
    //定义一个积分
    int score;
    //定义小蛇状态,判断死亡
    boolean isDie=false;//默认存活

    public void init(){
        //初始化蛇长度
        length=3;
        //初始化蛇头坐标
        snakeX[0]=175;
        snakeY[0]=275;
        //初始化第一节身子坐标
        snakeX[1]=150;
        snakeY[1]=275;
        //初始化第二节
        snakeX[2]=125;
        snakeY[2]=275;
        //初始化蛇头方向
        direction="R";//U D L R
        //初始化食物坐标
        foodX=300;
        foodY=200;
    }
    public GamePanel(){
        init();
        //将焦点定位在当前操作的面板上
        this.setFocusable(true);
        //加入监听
        this.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                //监听键盘按下的键
                super.keyPressed(e);
                int keyCode=e.getKeyCode();
                if(keyCode==KeyEvent.VK_SPACE){//监听空格
                    if(isDie){
                        //全部初始化
                        init();
                        isDie=false;
                    }else{//没有死亡，暂停开始
                        isStart=!isStart;//取反状态 暂停，开始
                        repaint();//重绘
                    }

                }
                //监听向上
                if(keyCode==KeyEvent.VK_UP){
                    direction="U";
                }
                //监听向下
                if(keyCode==KeyEvent.VK_DOWN){
                    direction="D";
                }
                //监听向左
                if(keyCode==KeyEvent.VK_LEFT){
                    direction="L";
                }
                //监听向右
                if(keyCode==KeyEvent.VK_RIGHT){
                    direction="R";
                }

            }
        }) ;
    //对定时器进行初始化；
    timer=new Timer(100, new ActionListener() {
        //ActionListener 事件监听，每100ms监听一次
        //具体的动作放入actionPerformed


        @Override
        public void actionPerformed(ActionEvent e) {
            if(isStart&&isDie==false){
                //后一节身子走到前一节的位置
                for (int i =length-1; i>0 ; i--) {
                    snakeX[i]=snakeX[i-1];
                    snakeY[i]=snakeY[i-1];
                }
                //动头
                if("R".equals(direction)){
                    snakeX[0]+=25;
                }
                if("L".equals(direction)){
                    snakeX[0]-=25;
                }
                if("U".equals(direction)){
                    snakeY[0]-=25;
                }
                if("D".equals(direction)){
                    snakeY[0]+=25;
                }

                //无边界模式
                //右边界

/*                if(snakeX[0]>800){
                    snakeX[0]=25;
                }
                //左边界
                if(snakeX[0]<25){
                    snakeX[0]=800;
                }
                //上边界
                if(snakeY[0]<75){
                    snakeY[0]=625;
                }
                //下边界
                if(snakeY[0]>625){
                    snakeY[0]=75;
                }*/


                //检测碰撞动作
                //食物坐标和蛇头一样
                if(snakeX[0]==foodX&&snakeY[0]==foodY){
                    //蛇长度++
                    length+=2;
                    //食物坐标随机改变
                    /*
                     Math.random() ->[0.0,1.0)
                     Math.random()*30+1.0 ->[0.0,31.0)
                     (int)(Math.random()*30+1.0)->[0,31]
                     (int)(Math.random()*30+1.0)+1 ->[1,32]
                     */
                    foodX=((int)(Math.random()*30+1.0)+1)*25;//[25,800]
                    /*
                    [75,625]->[3,25]*25
                    [3,25]->[0,22]+3
                    [0,22]
                    new Random().nextInt(23);->[0,23)
                     */
                    foodY=(new Random().nextInt(23)+3)*25;//[75,625]

                    score+=2;
                }
                //自身碰撞死亡判定：
                for (int i = 1; i <length ; i++) {
                    if(snakeX[0]==snakeX[i]&&snakeY[0]==snakeY[i]){
                        //将死亡状态 改为true
                        isDie=true;

                    }

                }
                //越界死亡判定
                if(snakeX[0]>800||snakeX[0]<25||snakeY[0]>625||snakeY[0]<75){

                    isDie=true;
                }

                repaint();//界面重绘

            }
        }
    });
    //定时器必须要启动
        timer.start();

    }

    //这个方法比较特殊，图形版的main方法，自动调用，参数 Graphics g(画笔)
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        //填充背景颜色
        this.setBackground(new Color(76, 76, 5));

        //画标题图片 this当前面板，g 画笔
        Images.headerImg.paintIcon(this,g,0,0);//x y 以窗体为整体算坐标！而不是电脑屏幕


        //调节画笔颜色
        g.setColor(new Color(246, 233, 233));
        //画一个矩形
        g.fillRect(25,75,800,575);

        //画小蛇,
        // 蛇头，方向
        if("R".equals(direction)){
            Images.rightImg.paintIcon(this,g,snakeX[0],snakeY[0]);
        }
        if("L".equals(direction)){
            Images.leftImg.paintIcon(this,g,snakeX[0],snakeY[0]);
        }
        if("U".equals(direction)){
            Images.upImg.paintIcon(this,g,snakeX[0],snakeY[0]);
        }
        if("D".equals(direction)){
            Images.downImg.paintIcon(this,g,snakeX[0],snakeY[0]);
        }

        // 蛇头
        //Images.rightImg.paintIcon(this,g,snakeX[0],snakeY[0]);
/*        //第一节身子
        Images.bodyImg.paintIcon(this,g,snakeX[1],snakeY[1]);
        //第二节身子
        Images.bodyImg.paintIcon(this,g,snakeX[2],snakeY[2]);*/
        for (int i =1; i <length; i++) {
            Images.bodyImg.paintIcon(this,g,snakeX[i],snakeY[i]);
        }

        //如果游戏处于暂停，画一个提示文字
        if(isStart==false){
            g.setColor(new Color(68, 103, 205));
            //参数： 字体 加粗  字号
            g.setFont(new Font("微软雅黑",Font.BOLD,40));
            g.drawString("按空格开始游戏",300,300);
        }

        //画食物：
        Images.foodImg.paintIcon(this,g,foodX,foodY);

        //画积分
        g.setColor(new Color(239, 241, 245));
        //参数： 字体 加粗  字号
        g.setFont(new Font("微软雅黑",Font.BOLD,20));
        g.drawString("得分："+score,700,30);

        //画入死亡文字
        if(isDie){

            g.setColor(new Color(215, 22, 22));
            //参数： 字体 加粗  字号
            g.setFont(new Font("微软雅黑",Font.BOLD,100));
            g.drawString("九折水瓶？！",200,300);

            g.setColor(new Color(215, 22, 22));
            //参数： 字体 加粗  字号
            g.setFont(new Font("微软雅黑",Font.BOLD,50));
            g.drawString("按空格重新开始",200,400);

        }
    }
}
